#ifndef __NATSUME_Configuration_h__
#define __NATSUME_Configuration_h__

#include <algorithm>
#include <cctype>
#include <cstddef>
#include <cstring>
#include <iostream>
#include <map>
#include <set>
#include <string>
#include <vector>

namespace NATSUME {
    // 宏定义结构体
    struct InforArgs {
        // 配置文件路径
        const std::string           CONFIG_PATH = "/home/ubuntu/Documents/Github/Book/SearchEngine/conf/setting.conf";
    };

    
    // 配置文件类
    class Configuration {
        public:
            // 构造函数
            Configuration(const std::string  & filePath);
            // 析构函数
            ~Configuration();
        
        public:
            // 获取配置文件内容
            std::map<std::string, std::string> & 
            getConfigMap();
            // 获取中文停用词词集
            std::set<std::string> &
            getCN_StopWordList();
            // 获取英文停用词词集
            std::set<std::string> &
            getEN_StopWordList();
        
        private:
            // 初始化配置文件内容
            void initConfigMap();
            // 初始化中文停用词词集
            void initCN_StopWordList();
            // 初始化英文停用词词集
            void initEN_StopWordList();
        
        private:
            // 配置文件路径 /home/ubuntu/Documents/Github/Book/SearchEngine/conf/setting.conf
            std::string                         m_filePath;
            // 配置文件内容
            std::map<std::string, std::string>  m_configMap;
            // 中文停用词词集
            std::set<std::string>               m_cn_stopWordList;
            // 英文停用词词集
            std::set<std::string>               m_en_stopWordList;
            // 基本数据的宏信息结构体
            InforArgs                           m_inforArgs;
    };


    // 打印调试函数
    template <typename Coll>
    void PRINT_ELEMENT(const Coll &coll) {
        for (const auto & elem : coll)
            std::cout << "[value]:\t" << elem << std::endl;

        std::cout << std::endl;
    }

    // 打印调试函数
    template <typename Coll>
    void PRINT_ELEMENTS(const Coll &coll) {
        for (const auto & it : coll)
            std::cout << "[key]:\t" << it.first << "\t[value]:\t" << it.second << std::endl;

        std::cout << std::endl;
    }
    
}

#endif // __NATSUME_Configuration_h__